package com.jlf.core.engine.domain;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.jlf.core.annotation.Domain;
import com.jlf.core.domain._SimpleDO;
import com.jlf.core.engine.constant.SchemaConstant;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;

/**
 * 定义模型领域的索引，包括唯一性约束
 *
 * @author wujr
 * 2023/7/14
 * @version 1.0
 * 【变更历史】
 * [wujr 2023/7/14 1.0 新增]
 */
@Getter
@Setter
@Domain(code = "schemaIndex", name = "领域索引", table = "e_jlf_schema_index")
public class SchemaIndexDO extends _SimpleDO<SchemaIndexDO> {
    /**
     * 模型领域的编码 {@link SchemaDomainDO#getDomainCode()}
     */
    private String domainCode;
    /**
     * 索引的名称
     */
    private String name;
    /**
     * 该索引的列名称，多个列用逗号分隔
     */
    private String columns;
    /**
     * 是否唯一性
     */
    private Boolean uniqueness;
    /**
     * 索引类型：{@link com.jlf.core.engine.constant.SchemaConstant.Domain.Index}
     * type=1为索引
     * type=2为唯一键
     */
    private Integer type;
    /**
     * 索引的状态
     */
    private Integer status;
    /**
     * 索引类别（可为 null）；TYPE 为 tableIndexStatistic 时索引类别为 null
     */
    private String qualifier;
    /**
     * 索引中的列序列号；TYPE 为 tableIndexStatistic 时该序列号为零
     */
    private Short position;
    /**
     * 列排序序列，”A” => 升序，”D” => 降序，如果排序序列不受支持，可能为 null；TYPE 为 tableIndexStatistic 时排序序列为 null
     */
    private String ascOrDesc;
    /**
     * TYPE 为 tableIndexStatistic 时，它是表中的行数；否则，它是索引中惟一值的数量。
     */
    private Integer cardinality;
    /**
     *  TYPE 为 tableIndexStatisic 时，它是用于表的页数，否则它是用于当前索引的页数。
     */
    private Integer pages;
    /**
     * 过滤器条件，如果有的话。（可能为 null）
     */
    private String filterCondition;
    private String remark;

    @JsonIgnore
    @JsonIgnoreProperties
    public boolean isIndex(){
        return SchemaConstant.Domain.Index.index.equals(this.type);
    }
    @JsonIgnore
    @JsonIgnoreProperties
    public boolean isUnique(){
        return SchemaConstant.Domain.Index.unique.equals(this.type);
    }

    @JsonIgnore
    @JsonIgnoreProperties
    public boolean isUniqueness(){
        return Boolean.TRUE.equals(this.uniqueness);
    }

    @JsonIgnore
    @JsonIgnoreProperties
    public boolean isContainColumn(String columnName){
        String[] columns = StringUtils.split(this.columns, ",");
        for (String column : columns){
            if (column.equalsIgnoreCase(columnName)){
                return true;
            }
        }
        return false;
    }
}
